package message

import (
	"encoding/json"
	"time"
)

const AsyncComm = "AsyncComm" //

type ClientMsg struct {
	Code        string `json:"code"`
	Uid         int64  `json:"uid"`
	MessageText string `json:"message_text"`
}

func ToMsg(Code string, data any, uid int64) (string, error) {
	MessageDataText, e := json.Marshal(data)
	if e != nil {
		return "", e
	}
	MessageData := ClientMsg{
		Code:        Code,
		MessageText: string(MessageDataText),
		Uid:         uid,
	}
	MessageText, ee := json.Marshal(MessageData)
	if ee != nil {
		return "", ee
	}
	return string(MessageText), nil
}

type BaseData struct {
	Type      string      `json:"type"`           // 消息类型（例如 "request", "response", "heartbeat" , "status", "progress" 等）
	Status    string      `json:"status"`         // 状态（如 "success", "error", "pending"）
	Message   string      `json:"message"`        // 额外的消息说明（如错误信息、描述等）
	RequestId string      `json:"requestId"`      // 请求唯一标识符，用于追踪
	Timestamp int64       `json:"timestamp"`      // 消息时间戳
	Data      interface{} `json:"data,omitempty"` // 数据字段，具体消息类型的数据
}

type RequestResponseData struct {
	BaseData
	Data interface{} `json:"data"` // 请求或响应的数据
}

type StatusUpdateData struct {
	BaseData
	StatusCode int    `json:"statusCode"` // 状态码（例如 200, 400, 500 等）
	Reason     string `json:"reason"`     // 状态更新的原因或说明
}

type ProgressData struct {
	BaseData
	Progress1   float64 `json:"progress_1"`  // 当前进度（0-100）
	Progress2   float64 `json:"progress_2"`  // 当前进度（0-100）
	Progress3   float64 `json:"progress_3"`  // 当前进度（0-100）
	CurrentStep int     `json:"currentStep"` // 当前步骤
	TotalSteps  int     `json:"totalSteps"`  // 总步骤数
}

func NewHeartbeatData() *BaseData {
	return &BaseData{
		Type:      "heartbeat",
		Status:    "success",
		Timestamp: time.Time{}.UnixNano(),
		Data:      "ping",
	}
}

func NewBaseData(status string, msg string) *BaseData {
	return &BaseData{
		Type:      "status",
		Status:    status,
		Timestamp: time.Time{}.UnixNano(),
		Message:   msg,
	}
}

func NewProgressData(status string, progress float64, currentStep, totalSteps int) *ProgressData {
	data := ProgressData{
		BaseData: BaseData{
			Type:      "progress",
			Status:    status,
			Timestamp: time.Time{}.UnixNano(),
		},
		CurrentStep: currentStep,
		TotalSteps:  totalSteps,
	}
	if currentStep == 1 {
		data.Progress1 = progress
	} else if currentStep == 2 {
		data.Progress2 = progress
	} else {
		data.Progress3 = progress
	}
	return &data
}

type NotificationData struct {
	BaseData
	Category string `json:"category"` // 通知的类别（例如 "error", "warning", "info"）
	Title    string `json:"title"`    // 通知的标题
}
